package pe.intix.drawback.model;

import java.util.Date;
import javax.persistence.*;
import javax.validation.constraints.*;

import org.openxava.annotations.*;

import pe.intix.drawback.validators.*;

/**
 * @author Jeromy Altuna
 * @author Renato
 */
@Entity
@EntityValidator(
	value=CantidadUnidadesMenorOIgualADisponible,
	properties=[
		@PropertyValue(name="detalleComprobantePago"),
		@PropertyValue(name="cantidad")
	] 	
)
@View(members = """
		detalleComprobantePago; 
		Unidades [#
			cantidad
		];
		Dua [# 
			duaImportacion, serie, fechaDua,
		]"""
)
@Tab(properties="""
		duaImportacion, detalleComprobantePago.comprobantePago.serie,
		detalleComprobantePago.comprobantePago.numero, 
		detalleComprobantePago.comprobantePago.fecha, 
		declaracionJurada.proveedor.razonSocial,
		detalleComprobantePago.producto.descripcion, cantidad, saldoKardex"""
)
@Table(name = "detalle_declaracion_jurada")
class DetalleDeclaracionJurada {
	
	@Hidden
	@Id @GeneratedValue(strategy = GenerationType.AUTO) 
	@Column(name = "id_detalle_declaracion")
	Long id
	
	@Required
	@Column(name = "dua_importacion", length = 30)
	String duaImportacion
	
	@Required
	@Column(name = "serie", length = 7)
	String serie
	
	@Required
	@Column(name = "fecha_dua")
	@Temporal(TemporalType.TIMESTAMP)
	Date fechaDua
	
	@Column(name = "cantidad", precision = 18, scale = 6, nullable = false)
	BigDecimal cantidad = new BigDecimal("0.0")
	
	@Column(name = "cantidad_terceros", precision = 18, scale = 6, nullable = false)
	BigDecimal cantidadTerceros = new BigDecimal("0.0")
	
	@Column(name = "saldo_kardex", precision = 18, scale = 6)
	BigDecimal saldoKardex
	
	@Required @NoFrame @NoCreate @NoModify 
	@SearchAction("DetalleDeclaracionJurada.buscarDetalleComprobante")
	@ReferenceView("ConDatosComprobante")
	@JoinColumn(name = "item", referencedColumnName = "item")
	@ManyToOne
	DetalleComprobantePago detalleComprobantePago
	
	@JoinColumn(name = "id_declaracion", referencedColumnName = "id_declaracion")
	@ManyToOne
	DeclaracionJurada declaracionJurada
	
	void setCantidad(BigDecimal cantidad){
		this.cantidad = cantidad >=0?cantidad:-cantidad
	}
	
	@PrePersist 
	private void actualizarUnidades(){
		saldoKardex = getCantidad()
		detalleComprobantePago.actualizarDeclaradoEnDua(getCantidad())
	}
	
	@PostRemove
	private void removerUnidades(){
		saldoKardex = 0
		detalleComprobantePago.actualizarDeclaradoEnDua(-getCantidad())
	}	
}
